package com.tidy.seed.admin.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tidy.seed.admin.system.entity.Menu;
import com.tidy.seed.admin.system.mapper.MenuMapper;
import com.tidy.seed.admin.system.service.MenuService;
import com.tidy.seed.admin.system.vo.FindAllTreeVO;
import com.tidy.seed.admin.system.vo.FindApiByMenuTreeVO;
import com.tidy.seed.util.TreeUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author HZ-ZY
 * @since 2025-08-05
 */
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {
    @Resource
    private MenuMapper menuMapper;

    @Override
    public List<FindAllTreeVO> findAllTree() {
        // 1. 查询所有菜单
        List<Menu> allMenus = menuMapper.selectList(new QueryWrapper<Menu>()
                .orderByDesc("sort"));  // 按排序字段升序

        // 2. 转换为VO列表
        List<FindAllTreeVO> allVos = allMenus.stream()
                .map(menu -> FindAllTreeVO.builder()
                        .id(menu.getId())
                        .menuName(menu.getMenuName())
                        .menuKey(menu.getMenuKey())
                        .menuIcon(menu.getMenuIcon())
                        .path(menu.getPath())
                        .componentPath(menu.getComponentPath())
                        .menuType(menu.getMenuType())
                        .sort(menu.getSort())
                        .remark(menu.getRemark())
                        .parentId(menu.getParentId())
                        .createAt(menu.getCreateAt())
                        .updateAt(menu.getUpdateAt())
                        // 特殊字段映射
                        .value(menu.getId())
                        .label(menu.getMenuName())
                        // 初始化子节点集合
                        .children(new ArrayList<>())
                        .build())
                .collect(Collectors.toList());
        // 3. 构建树形结构，顶级菜单parentId为-1
        return TreeUtils.buildTree(allVos, -1);
    }

    @Override
    public List<FindApiByMenuTreeVO> findApiByMenuTree() {
        // 1. 获取扁平数据（菜单和API权限的混合列表）
        List<FindApiByMenuTreeVO> flatList = menuMapper.findApiByMenuTree();
        // 2. 转换为树形结构
        return TreeUtils.buildTree(flatList, -1);
    }
}

